;Written by: saldat`as
;Copyrighted: saldat`as
;Don't copy, just use it!

;Klauskit nepadesiu :)
;E-mail: saldatas(eta)gmail.com
;skype: bordiuras
;one.lt: saldat`as
;Uzduotis: Base64 koduote. Faila uzkoduoja ir atkoduoja naudojant Base64 koduote. 


.MODEL small

.STACK 100h

.DATA
abecele DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
klaida DB "Klaida su ivesta komandine eilute.", 10, 13, '$'
msghelp DB "Rasyti: 2uzd.exe e/d srcfile.txt destfile.txt e - uzkoduoti, d - atkoduoti.", 10, 13, '$'
neatidare DB "Klaida su duomenu failu!", 10, 13, '$'
neatidarer DB "Klaida su rezultatu failu!", 10, 13, '$'
nenuskaite DB "Klaida nuskaitant duomenu faila!", 10, 13, '$'
neatpazinta DB "Neatpazintas simbolis!", 10, 13, '$'
handle DW 0
h DW 0
buf DB 100h dup(?)
fbuf DB 100h dup(?)
duom DB 255 dup(?)
rez  DB 255 dup(?)
.CODE
start:
	mov ax, @data
	mov ds, ax	
	
	mov bx, 81h	
	xor ax, ax	
	mov ax, es:[bx]				                
	cmp al, 0Dh      
	je helpas 
	
	mov bx, 82h	
	xor ax, ax	
	mov ax, es:[bx]				                
	cmp al, '/'        
	je helpme  
	cmp al, 'e' 
	je ok
	cmp al, 'd'	
	je ok
	jmp eror
	
helpme:
	mov bx, 83h
	xor ax, ax
	mov ax, es:[bx]
	cmp al, '?'
	je helpas
	jmp eror

helpas:
	mov ah, 09h
	lea dx, msghelp
	int 21h
    	mov ax, 04c00h
	int 21h	

ok:
	mov bx, 83h	
	xor ax,ax	
	mov al, es:[bx]				                
	cmp al,' '      
	jne eror

	mov bx, 84h	
	mov dx, offset duom
	lea si, duom
	
ieskot:
	xor ax,ax
	mov al, es:[bx]		
	cmp al, 20h			
	je next	 
    	mov [si],ax
    	inc si  
	inc bx	
	jmp ieskot
	
eror:
	mov ah, 09h
	lea dx, klaida
	int 21h
	mov ax, 04c00h
	int 21h
	
next:
    	mov dx, offset rez
    	lea si, rez
	
ieskoti:
	xor ax,ax
	inc bx 
	mov al, es:[bx]		
	cmp ax, 0Dh			
	je n3xt	 
    	mov [si],ax 
	inc si
	jmp ieskoti

n3xt:	
	mov ax, 3d00h
	mov dx, offset duom
	int 21h
	mov [handle], ax
	mov bx, ax
	jc exit2
	
	mov ah, 3Ch
	mov cx, 0
	mov dx, offset rez
	int 21h
	jc exit3	
	mov [h], ax
	
	mov bx, 0082h	
    	xor ax,ax	
	mov ax, es:[bx]				                     
	cmp al, 'e' 
    	je e
    	cmp al, 'd'	
    	je d	
	jmp exit	

e:
	mov ah, 3fh
	mov bx, [handle]
	mov cx, 3
	mov dx, offset fbuf
	int 21h
	jc exit4
	
	or ax, ax
	jz exit
	mov cx, ax
	mov di, offset buf
	
	call encoding
	
	jmp short e

d:
	mov ah, 3fh
	mov bx, [handle]
	mov cx, 4
	mov dx, offset fbuf
	int 21h
	jc exit4
	
	or ax, ax
	jz exit
	mov cx, ax
	mov di, offset buf
	
	call decoding
	
	jmp short d

exit2:
	mov ah, 09h
	lea dx, neatidare
	int 21h
	mov ax, 04c00h
	int 21h
	
exit3:
	mov ah, 09h
	lea dx, neatidarer
	int 21h
	mov ax, 04c00h
	int 21h
	
exit4:
	mov ah, 09h
	lea dx, nenuskaite
	int 21h
	
	mov ah, 3eh
	mov bx, [h]
	int 21h
	
	mov ah, 41h
	lea dx, rez
	int 21h
	
	mov ax, 04c00h
	int 21h
	
exit:
	mov bx, [handle]
	or bx, bx
	jz noclose
	
	mov ah, 3eh
	int 21h

noclose:
	mov ax, 04c00h
	int 21h

encoding proc
	push ax
	push bx
	push cx
	push dx
	
	mov ch, al

first_char:
	lea si, fbuf 
	mov bl, [si]
	push bx
	shr bl, 2
	xor bh, bh
	mov si, bx
	mov al, [ds:si] 
	mov si, 0
	mov [buf+si], al
	inc si
	pop bx
	push si

	cmp ch, 2
	jae second_char
	mov al, 0
	jmp temp

second_char:	
	lea si, fbuf+si
	mov al, [si]
temp:
	push ax
	shr al, 4
	shl bl, 6
	shr bl, 2
	or bl, al
	xor bh, bh
	mov si, bx
	mov al, [ds:si]
	pop bx
	pop si
	mov [buf+si], al
	inc si
	push si
	
	cmp ch, 2
	jae check
	mov al, "="
	pop si
	mov [buf+si], al
	inc si
	mov [buf+si], al
	mov cx, 4
	jmp print

check:
	cmp ch, 3
	jae third_char
	mov ax, 0
	jmp nulis
	
third_char:
	lea si, fbuf+si
	mov al, [si]
nulis:
	push ax
	shr al, 6
	shl bl, 4
	shr bl, 2
	or bl, al
	xor bh, bh
	mov si, bx
	mov al, [ds:si]
	pop bx
	pop si
	mov [buf+si], al
	inc si
	push si
	
	cmp ch, 3
	jae fourth_char
	mov al, "="
	pop si
	mov [buf+si], al
	mov cx, 4
	jmp print
	
fourth_char:
	shl bl, 2
	shr bl, 2
	xor bh, bh
	mov si, bx
	mov al, [ds:si]
	pop si
	mov [buf+si], al
	mov cx, 4
	
print:
	mov ah, 40h
	mov bx, [h]
    	mov dx, offset buf
	int 21h
	
	pop dx
	pop cx
	pop bx
	pop ax
	ret
encoding endp

decoding proc
	push ax
	push bx
	push cx
	push dx
	
	mov si, 0
	push si
	
	lea si, fbuf
	mov bl, [si]
	pop si
	inc si
	call paieska
	mov bh, cl
	
	push si
	lea si, fbuf+si
	mov bl, [si]
	call paieska
	mov bl, cl
	mov ah, bl
	shl bh, 2
	shr bl, 4
	or bh, bl
	mov si, 0
	mov [buf+si], bh
	
	pop si
	inc si
	push si
	lea si, fbuf+si
	mov bl, [si]
	cmp bl, "="
	jne forward
	mov cx, 1
	jmp spausdint

forward:
	call paieska
	mov bl, cl
	mov bh, bl
	shl ah, 4
	shr bl, 2
	or ah, bl
	mov si, 1
	mov [buf+si], ah
	
	pop si
	inc si
	lea si, fbuf+si
	mov bl, [si]
	cmp bl, "="
	jne forward_1
	mov cx, 2
	jmp spausdint

forward_1:
	call paieska
	mov bl, cl
	shl bh, 6
	or bh, bl
	mov si, 2
	mov [buf+si], bh
	mov cx, 3

spausdint:	
	mov ah, 40h
	mov bx, [h]
    	mov dx, offset buf
	int 21h
	
	pop dx
	pop cx
	pop bx
	pop ax
	ret
decoding endp

paieska proc
	push ax
	push bx
	push dx
	push si
	
	mov cl, -1
	mov si, 0
	
kartoti:
	mov al, [ds:si]
	inc cl
	inc si
	cmp cl, 40h
	ja exit5
	cmp al, bl
	jne kartoti
	
	pop si
	pop dx
	pop bx
	pop ax
	ret

exit5:
	mov ah, 09h
	lea dx, neatpazinta
	int 21h
	
	mov ah, 3eh
	mov bx, [h]
	int 21h
	
	mov ah, 41h
	lea dx, rez
	int 21h
	
	mov ax, 04c00h
	int 21h
	
paieska endp

end start
